#! /usr/bin/env python
import random
import sys

from auxi import *
from menu import *
from comida import *
from inimigo import *
from snake import *

def start_game():
    global tela, clock, largura, altura
    pygame.init()
    pygame.mixer.init()
    pygame.font.init()
    random.seed()
    tela = pygame.display.set_mode((500, 500))
    largura = tela.get_width()
    altura = tela.get_height()
    pygame.display.set_caption('DamnSnake')
    clock = pygame.time.Clock()

def texto(intext, size, inx, iny, color):
    fonte = pygame.font.Font(None, size)
    texto = fonte.render((intext), 1, color)
    if inx == -1:
        x = largura / 2
    else:
        x = inx
    if iny == -1:
        y = altura / 2
    else:
        y = iny
    textpos = texto.get_rect(centerx=x, centery=y)
    tela.blit(texto, textpos)

arquivo = carrega_arquivo("pontuacao.txt")
ranking = arquivo.readline().strip().split("|")
lista_colocados = arquivo.readline().strip().split("|")
arquivo.close()
posicao = 6

rodando = True
inicia = False
pontos = 0
maxpontos = ranking[0]
aguarda = False
multiplo = 1

start_game()
menu = Menu()

gameplay_fundo = carrega_imagem("jogo_background.jpg")
logo_fundo = carrega_imagem("logo.jpg")
ranking_fundo = carrega_imagem("ranking.jpg")
logo_nome = carrega_imagem("DamnSnake1.png")

som_menu = carrega_som("intro.wav")
som_jogo = carrega_som("musica_jogo1.wav")

pygame.event.set_blocked(pygame.MOUSEMOTION)

inimigos = []
snake = Snake()
comida = Comida()

while rodando:
    som_menu.play(-1)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                if menu.menuselecionado == 0:
                    menu.menuselecionado = len(menu.menu)-1
                else:
                    menu.menuselecionado = menu.menuselecionado-1

            elif event.key == pygame.K_RIGHT:
                if menu.menuselecionado == len(menu.menu)-1:
                    menu.menuselecionado = 0
                else:
                    menu.menuselecionado = menu.menuselecionado + 1

            elif event.key == pygame.K_RETURN:
                if menu.menuselecionado == 0:
                    som_menu.stop()
                    inicia = True
                    while inicia:
                        som_jogo.play(-1)
                        tela.blit(gameplay_fundo, (0, 0))

                        snake.move()
                        snake.draw()
                        comida.draw()

                        if pontos == multiplo * 5:
                            multiplo = multiplo + 1
                            inimigos.append(Inimigo())

                        for inimigoAdicionado in inimigos:
                            inimigoAdicionado.update()
                            inimigoAdicionado.draw()
                            if inimigoAdicionado.checa_colisao(snake.pixels):
                                snake.crash = True

                        if comida.checa_colisao(snake.pixels):
                            comida.realocar()
                            pontos = pontos + 1
                            snake.comprimento = snake.comprimento + 10

                        texto("Pontos: " + str(pontos), 16, largura / 2-50, 10, (255, 255, 255))
                        texto("Maior Pontuacao: " + str(maxpontos), 16, largura / 2 + 50, 10, (255, 255, 255))

                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                pygame.quit()
                                sys.exit()
                            if event.type == pygame.KEYDOWN:
                                snake.events(event)

                        pygame.display.flip()
                        clock.tick(140)

                        while snake.crash:
                            if aguarda == False:
                                for indice in range(len(ranking), 0, -1):
                                    if pontos > int(ranking[indice - 1]):
                                        posicao -= 1
                                if posicao < 6:
                                    novoranking = ""
                                    ranking.insert(posicao - 1, str(pontos))
                                    ranking.pop(5)
                                    texto("Novo Recorde ---> " + str(posicao) + "o Lugar", 30, -1, altura / 2-60, (255, 255, 255))
                                    nome = entrada_usuario("Nome")
                                    lista_colocados.insert(posicao - 1, nome)
                                    lista_colocados.pop(5)
                                    for indice in range(0, len(ranking)):
                                        if indice == len(ranking) - 1:
                                            novoranking = novoranking + (ranking[indice]) + "\n"
                                        else:
                                            novoranking = novoranking + (ranking[indice]) + "|"
                                    for indice in range(0, len(lista_colocados)):
                                        if indice == len(lista_colocados) - 1:
                                            novoranking = novoranking + (lista_colocados[indice]) + "\n"
                                        else:
                                            novoranking = novoranking + (lista_colocados[indice]) + "|"
                                    arquivo = carrega_arquivo("pontuacao.txt", "w")
                                    arquivo.write(novoranking)
                                    arquivo.close()
                                    tela.blit(ranking_fundo, (0, 0))
                                texto("Fim de Jogo, Pontos: " + str(pontos), 40, -1, -1, (255, 255, 255))
                                texto("Aperte R para jogar novamente", 30, -1, altura / 2 + 30, (255, 255, 255))
                                texto("Aperte M para retornar ao menu", 30, -1, altura / 2 + 50, (255, 255, 255))
                                pygame.display.flip()
                                aguarda = True
                            clock.tick(50)

                            for event in pygame.event.get():
                                if event.type == pygame.QUIT:
                                    snake.crash = False
                                    pygame.quit()
                                    sys.exit()
                                elif event.type == pygame.KEYDOWN:
                                    if event.key == pygame.K_r:
                                        pontos = 0
                                        posicao = 6
                                        aguarda = False
                                        multiplo = 1
                                        del inimigos[:]
                                        comida.__init__()
                                        snake.__init__()
                                    elif event.key == pygame.K_m:
                                        inicia = False
                                        snake.crash = False
                                        pontos = 0
                                        posicao = 6
                                        aguarda = False
                                        multiplo = 1
                                        del inimigos[:]
                                        comida.__init__()
                                        snake.__init__()
                                        som_jogo.stop()

                elif menu.menuselecionado == 1:
                    espera = True
                    while espera:
                        tela.blit(ranking_fundo, (0,0))
                        cor_texto = (0, 0, 0)
                        texto("Ranking Geral", 50, -1, 50, cor_texto)
                        texto(lista_colocados[0] + "--------------" + ranking[0], 40, -1, 200, cor_texto)
                        texto(lista_colocados[1] + "--------------" + ranking[1], 40, -1, 230, cor_texto)
                        texto(lista_colocados[2] + "--------------" + ranking[2], 40, -1, 260, cor_texto)
                        texto(lista_colocados[3] + "--------------" + ranking[3], 40, -1, 290, cor_texto)
                        texto(lista_colocados[4] + "--------------" + ranking[4], 40, -1, 320, cor_texto)
                        texto("Pressione Enter ou Esc para retornar ao menu", 30, -1, 450, cor_texto)

                        pygame.display.flip()
                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                pygame.quit()
                                sys.exit()
                            if event.type == pygame.KEYDOWN:
                                if event.key == pygame.K_RETURN or event.key == K_ESCAPE:
                                    espera = False

                elif menu.menuselecionado == 2:
                    espera = True
                    while espera:
                        tela.blit(ranking_fundo, (0,0))
                        cor_texto = (0, 0, 0)
                        texto("Creditos", 50, -1, 50, cor_texto)
                        texto("Professores:", 40, -1, 150, cor_texto)
                        texto("Dalton Serey", 40, -1, 200, cor_texto)
                        texto("Jorge Figueiredo", 40, -1, 230, cor_texto)
                        texto("Equipe:", 40, -1, 290, cor_texto)
                        texto("Italo Guedes", 40, -1, 340, cor_texto)
                        texto("Tiago Leite", 40, -1, 370, cor_texto)
                        texto("Pressione Enter ou Esc para retornar ao menu", 30, -1, 450, cor_texto)

                        pygame.display.flip()
                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                pygame.quit()
                                sys.exit()
                            if event.type == pygame.KEYDOWN:
                                if event.key == pygame.K_RETURN or event.key == K_ESCAPE:
                                    espera = False

                elif menu.menuselecionado == 3:
                    pygame.quit()
                    sys.exit()

        if pygame.event.get() == pygame.QUIT:
            pygame.quit()
            sys.exit()

    tela.blit(logo_fundo, (0,0))
    tela.blit(logo_nome, (0,0))
    menu.crt_menu()
    menu.tela.blit(menu.background, (0, 0))

    pygame.display.flip()
